== LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN) {
libxl__qmp_initializations(ctx, domid);
}
- ret = libxl__confirm_device_model_startup(gc, dm_starting);
+ ret = libxl__confirm_device_model_startup(gc, dm_info, dm_starting);
if (ret < 0) {
LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
"device model did not start: %d", ret);
ret = ERROR_FAIL;
goto out_free;
}
- if (libxl__confirm_device_model_startup(gc, dm_starting) < 0) {
+ if (libxl__confirm_device_model_startup(gc, &xenpv_dm_info,
+ dm_starting) < 0) {
ret = ERROR_FAIL;
goto out_free;
}
int libxl__confirm_device_model_startup(libxl__gc *gc,
- libxl__spawner_starting *starting)
+ libxl_device_model_info *dm_info,
+ libxl__spawner_starting *starting)
{
+ libxl_ctx *ctx = libxl__gc_owner(gc);
char *path;
int domid = starting->domid;
+ int ret, ret2;
path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
- return libxl__spawn_confirm_offspring_startup(gc,
+ ret = libxl__spawn_confirm_offspring_startup(gc,
LIBXL_DEVICE_MODEL_START_TIMEOUT,
"Device Model", path, "running", starting);
+ if (dm_info->saved_state) {
+ ret2 = unlink(dm_info->saved_state);
+ if (ret2) LIBXL__LOG_ERRNO(ctx, XTL_ERROR,
+ "failed to remove device-model state %s\n",
+ dm_info->saved_state);
+ /* Do not clobber spawn_confirm error code with unlink error code. */
+ if (!ret) ret = ret2;
+ }
+ return ret;
}
int libxl__destroy_device_model(libxl__gc *gc, uint32_t domid)
* return pass *starting_r (which will be non-0) to
* libxl__confirm_device_model_startup or libxl__detach_device_model. */
_hidden int libxl__confirm_device_model_startup(libxl__gc *gc,
+ libxl_device_model_info *dm_info,
libxl__spawner_starting *starting);
_hidden int libxl__detach_device_model(libxl__gc *gc, libxl__spawner_starting *starting);
_hidden int libxl__wait_for_device_model(libxl__gc *gc,